在4.3.0
版本之前,Process
并不支持协程,需要在新进程的callback_function
中使用go
创建协程,并且进程自带的管道也不支持协程。在4.3.0
版本中,Process
也支持了协程,可以直接使用协程相关API
,也可以使用协程调度的方式,实现进程间通信。
4.3.0
版本Process
类的构造方法增加了第四个参数,传入true
表示开启协程。开启协程后,可以直接调用协程相关API
,无需自行创建。
$proc = new \swoole_process(function () {
co::sleep(0.2);
echo "SUCCESS\n";
}, false, 1, true);
$proc->start();
- 第四个参数传入
true
即可在callback_function
中直接使用协程API
4.3.0
版本新增了Process::exportSocket
可以将管道导出为一个Swoole\Coroutine\Socket
对象,通过读写此Socket
就可以实现通信。
$proc1 = new \swoole_process(function (swoole_process $proc) {
$socket = $proc->exportSocket();
echo $socket->recv();
$socket->send("hello proc2\n");
echo "proc1 stop\n";
}, false, 1, true);
assert($proc1->start());
$proc2 = new \swoole_process(function (swoole_process $proc) use ($proc1) {
Co::sleep(0.01);
$socket = $proc1->exportSocket();
$socket->send("hello proc1\n");
echo $socket->recv();
echo "proc2 stop\n";
}, false, 0, true);
assert($proc2->start());
swoole_process::wait(true);
swoole_process::wait(true);
- 主进程中不要使用协程,否则在协程空间内,可能无法
fork
子进程。主进程内还是继续使用同步阻塞或者异步的模式来管理进程 - 两个子进程之间实际上只需要一个管道即可完成通信
- 管道类型是
SOCK_STREAM
时,多个进程同时写入一个进程的管道,可能存在风险,可能会产生数据错乱。存在交叉写入时可以使用SOCK_DGRAM
格式的管道,或者进行加锁